<?php 
class Factura extends AppModel{
    var $name = 'Factura';
    var $belongsTo = array('Estado'=>array('className' => 'Estado','foreignKey' => 'estado_id'),
                            'Estadopago'=>array('className' => 'Estadopago','foreignKey' => 'estadopago_id'),
                            'Estadofactura'=>array('className' => 'Estadofactura','foreignKey' => 'estadofactura_id'),
                            'Usuario'=>array('className' => 'Usuario','foreignKey' => 'usuario_id'),
                            'Cliente'=>array('className' => 'Cliente','foreignKey' => 'cliente_id'),
                            'Documento'=>array('className' => 'Documento','foreignKey' => 'documento_id'),
                            'Moneda'=>array('className' => 'Moneda','foreignKey' => 'moneda_id'));
    
    var $hasMany = array('Detallefactura'=>array('className'=>'Detallefactura','foreignKey'=>'factura_id'));
    
	var $validate = array(
		'id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'estadopago_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'estadofactura_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'documento_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'cliente_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'moneda_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'usuario_id'=>array('notEmpty'=>array('rule'=>'notEmpty','last'=>true,'menssage'=>'Verifique los datos enviados')),
		'numero'=>array('notEmpty'=>array('rule'=>'notEmpty', 'message'=>'Numero: El sistema no le asigno un numero'),
						'maxLength'=>array('rule'=>array('maxLegth','20'),'last'=>true,'message'=>'Numero: Maximo 20 caracteres')),
		'igv'=>array('numeric'=>array('rule' =>'numeric','last'=>true,'message'=>'IGV: Ingrese un IGV')),
		'monto_sin_igv'=>array('numeric'=>array('rule' =>'numeric','last'=>true,'message'=>'Impuesto: El ingreso es solo de numeros')),
	    'monto_con_igv'=>array('numeric'=>array('rule' =>'numeric','last'=>true,'message'=>'Impuesto: El ingreso es solo de numeros')),
	    'monto_igv'=>array('maxLength'=>array('rule'=>array('maxLegth','8'),'last'=>true,'message'=>'Impuesto: Maximo 8 caracteres')),
	    'usuario_anular_id'=>array('numeric'=>array('rule'=>'numeric','last'=>true,'menssage'=>'Verifique los datos enviados'))
	);
	
	function countFactura($params){return $this->find('count',$params);}
	function dataFactura($params){return $this->find('all',$params);}

	 /** GENERA/EDITA UNA FACTURA MIENTRAS ESTE EN ESTADO EMITIDO
     *   return array('respuesta'=>false, 'mensaje'=>"MENSAJE");
     */
    function setFactura($data,$variables){
	    App::import('Model','Serie');  $this->Serie = new Serie();
		App::import('Model','Detallefactura');  $this->Detallefactura = new Detallefactura();
		App::import('Model','Documento');  $this->Documento = new Documento();
		App::import('Model','Articulo');                     $this->Articulo = new Articulo();
		App::import('Model','AlmacenesArticulo');            $this->AlmacenesArticulo = new AlmacenesArticulo();
		
		/** agregamos una nueva factura  **/
		if(empty($data['Factura']['id'])){
			/** pedimos la numeracion del nuevo documento **/
			$respuesta = $this->Serie->actualizarNumeracion('organizacion_id', $variables['Organizacion']['id'], null,$data['Documento']['tipodocumento_id']);

			if(!$respuesta['respuesta']) return $respuesta;

			/** Generamos el documento **/
			$documento = array('Documento'=>array(	'serie'=>$respuesta['serie'],
													'numero'=>$respuesta['numero'],
													'numero_serie'=>trim($respuesta['numero_serie']),
													'tipodocumento_id'=>$data['Documento']['tipodocumento_id'],
													'organizacion_id'=>$variables['Organizacion']['id'],
													'usuario_id'=>$variables['Usuario']['id']));	
		  	
			/** guardamos el documento que formamos **/
			$this->Documento->create();
			if(!$this->Documento->save($documento['Documento'])){
			    return array('respuesta'=>false, 'mensaje'=>"ERROR AL GUARDAR EL DOCUMENTO"); 
			    //return $this->visualizarError($this->Documento->validationErrors);
			}
			
			$data['Factura']['documento_id'] = $this->Documento->id;
			$data['Factura']['numero']=$documento['Documento']['numero_serie'];
			$data['Factura']['estadofactura_id']=1;  //estado emitido
			$data['Factura']['estadopago_id']=1;  //estado No pagado
			$data['Factura']['usuario_id']=$variables['Usuario']['id'];
			/** Eliminamos el id de factura pasado - ya que se esta agregando una orden compra **/
			unset($data['Factura']['id']);
			$this->create();
		}else{ 
		    //verificamos si es estado de la factura es emitido
		    $this->recursive=-1;
		    $factura_db = $this->findById($data['Factura']['id']);
		    if(!($factura_db['Factura']['estadofactura_id']==1))  return array('respuesta'=>false, 'mensaje'=>"LA FACTURA YA NO SE PUEDE EDITAR");
		    
		    //devolvemos los insumos de los detalles del de la factura
		    $conditions = array('Detallefactura.factura_id'=>$data['Factura']['id'], 'Detallefactura.estado_id'=>1);
    	    $detallefactura_ids = $this->Detallefactura->find('list',array('conditions'=>$conditions,'fields'=>array('Detallefactura.id','Detallefactura.id')));
		    foreach($detallefactura_ids as $detallefactura_id){
        		$respuesta = $this->Detallefactura->setReiniciar($detallefactura_id,'2');
        		if(!$respuesta['respuesta'])  return $respuesta;
    	    }
		}
	
		if(!$this->save($data['Factura']))  return array('respuesta'=>false, 'mensaje'=>"ERROR AL GUARDAR LA FACTURA - tonio", "Factura"=>$data['Factura'],"documento"=>$documento['Documento'], "error"=>$this->visualizarError($this->validationErrors));
		
		if(empty($data['Factura']['id'])) $data['Factura']['id'] = $this->id;

		/*
		 * configure::write('debug',1);
		debug($data);
		die;
		 */
		//guardamos los detalles de la factura
		foreach($data['Detalles'] as $detallefactura){
			//buscamos si existe el detalle
			$conditions = array('factura_id'=>$data['Factura']['id'],'articulo_id'=>$detallefactura['Detallefactura']['articulo_id'],'almacen_id'=>$detallefactura['Detallefactura']['almacen_id']);
		    $detallefactura_db = $this->Detallefactura->find('first',array('conditions'=>$conditions,'recursive'=>-1));
		    
			$detallefactura['Detallefactura']['factura_id'] = $data['Factura']['id'];
			$detallefactura['Detallefactura']['estado_id'] = 1;
			
			if(!empty($detallefactura_db))  $detallefactura['Detallefactura']['id'] = $detallefactura_db['Detallefactura']['id'];
			else  $this->Detallefactura->create();
			
			if(!$this->Detallefactura->save($detallefactura['Detallefactura']))
				return array('respuesta'=>false, 'mensaje'=>"ERROR AL GUARDAR DETALLE DE FACTURA - tono",'Detallefactura'=>$detallefactura['Detallefactura'], "error"=>$this->visualizarError($this->validationErrors));
			
			//retirar el stock disponible del almacen
			if(!$this->AlmacenesArticulo->setActualizarStock($detallefactura['Detallefactura']['almacen_id'],$detallefactura['Detallefactura']['articulo_id'],$detallefactura['Detallefactura']['cantidad'],'RESTA','D'))
			    return array('respuesta'=>false, 'mensaje'=>'STOCK ALM NO ACTUALIZADO');
        		
		    //retirar el stock disponible del articulo
		    if(!$this->Articulo->setActualizarStock($detallefactura['Detallefactura']['articulo_id'],$detallefactura['Detallefactura']['cantidad'],'RESTA','D'))
    			return array('respuesta'=>false, 'mensaje'=>'STOCK ART NO ACTUALIZADO');
			    
		}
		return array('respuesta'=>true, 'mensaje'=>"LA FACTURA HA SIDO GUARDADA", 'factura_id'=>$data['Factura']['id'],'numero'=>$data['Factura']['numero']);
	}
	
	 /**  ANULA UNA FACTURA
     *  1- CAMBIA EL ESTADO DE LA FACTURA A 'DE'
     *  2- REGRESA EL STOCK DISPONIBLE DEL ART Y ALM
     *  return array('respuesta'=>false, 'mensaje'=>"MENSAJE");
     */
	function setAnularFactura($factura_id, $variables){
	    if(empty($factura_id) || empty($variables))  array('respuesta'=>false, 'mensaje'=>"LA FACTURA NO EXISTE");
	    
		App::import('Model','Detallefactura');  $this->Detallefactura = new Detallefactura();
		
		//verificamos si es estado de la factura es emitido
	    $this->recursive=-1;
	    $factura_db = $this->findById($factura_id);
	    if(!($factura_db['Factura']['estadofactura_id']==1))  return array('respuesta'=>false, 'mensaje'=>"LA FACTURA YA NO SE PUEDE EDITAR");
		    
	    $factura['Factura']['id'] = $factura_id;
		$factura['Factura']['estadofactura_id'] = 4;
		$factura['Factura']['usuario_anular_id'] = $variables['Usuario']['id'];
		if(!$this->save($factura['Factura']))  array('respuesta'=>false, 'mensaje'=>"LA FACTURA NO HA SIDO ANULADA");
		
	    // devolvemos los insumos de los detalles del de la factura
	    $conditions = array('Detallefactura.factura_id'=>$factura['Factura']['id'], 'Detallefactura.estado_id'=>1);
	    $detallefactura_ids = $this->Detallefactura->find('list',array('conditions'=>$conditions,'fields'=>array('Detallefactura.id','Detallefactura.id')));
	    foreach($detallefactura_ids as $detallefactura_id){
    		$respuesta = $this->Detallefactura->setReiniciar($detallefactura_id,'1');
    		if(!$respuesta['respuesta'])  return $respuesta;
	    }
		return array('respuesta'=>true, 'mensaje'=>"LA FACTURA HA SIDO ANULADA");
	}
	
	/**AUTOR: JOSE ANTONIO VENTURA RUEDA 
	 * RECUPERO LOS DATOS DE LA FACTURA PARA FORMAR EL VALE 
	 *  Y LOS ALMACENES QUE SE PUEDEN SELECCIONAR
	 */
	function getValesalidaAlmacenes($factura_id, $variables){
		$valesalida = $this->find('first',array('conditions'=>array('Factura.id'=>$factura_id),'recursive'=>-1));
		$valesalida['Usuario'] = $variables['Usuario'];
		return $valesalida;
	}
	
	/** AUTOR: JOSE ANTONIO VENTURA RUEDA 
	 *  Actualiza el estado de la factura de acuerdo a los vale de salida entregados
	 */
	function setActualizarEstado($factura_id){
		app::import('Model','Detallefactura');  $this->Detallefactura = new Detallefactura();
	    
		$conditions=array('Detallefactura.factura_id'=>$factura_id,'Detallefactura.estado_id'=>1,'"Detallefactura"."valesalida_id" IS NULL');
		$count_DetSinVale = $this->Detallefactura->find('count',array('conditions'=>$conditions));
	    
	    if($count_DetSinVale <= 0) $estadofactura_id = 3;
	    else $estadofactura_id = 2;
	    
	    $this->id = $factura_id;
	    if(!$this->saveField('estadofactura_id',$estadofactura_id)) return array('respuesta'=>false, 'mensaje'=>"ESTADO FACTURA NO ACTUALIZADO", 'otros'=>$valesxentregar,'fac'=>$factura_id);
	    else return array('respuesta'=>true, 'mensaje'=>"LA FACTURA HA SIDO ACTUALIZADA");
	}
	
	/** AUTOR: JOSE ANTONIO VENTURA RUEDA
	 *  ACTUALIZA EL PAGO DE UNA FACTURA
	 */
	function setPago($factura_id,$cantidad,$accion = 'SUMAR'){
		$conditions = array('Factura.id'=>$factura_id);
		$fields = array('Factura.id','Factura.montopagado','Factura.monto_con_igv');
		$factura = $this->find('first',array('conditions'=>$conditions,'fields'=>$fields));
		
		if($accion == 'SUMAR'){
			$factura['Factura']['montopagado'] = empty($factura['Factura']['montopagado'])?$cantidad:$cantidad+$factura['Factura']['montopagado'];
		}else{
			if(empty($factura['Factura']['montopagado'])) return false;
			if($factura['Factura']['montopagado'] < $cantidad) return false;
			$factura['Factura']['montopagado'] -= $cantidad;
		}
		
		if($factura['Factura']['monto_con_igv'] > $factura['Factura']['montopagado'])  $factura['Factura']['estadopago_id'] = 2;
		else  $factura['Factura']['estadopago_id'] = 3;
		
		return $this->save($factura['Factura']);
	}
	
	/** AUTOR: JOSE ANTONIO VENTURA RUEDA
	 *  ACTUALIZA EL PAGO DE UNA FACTURA
	 */
	function getFactura($factura_id){
		App::import('Model', 'Detallefactura');   	$this->Detallefactura = new Detallefactura();
		
		$conditions = array('Factura.id'=>$factura_id);
		$fields = array('Factura.igv','Factura.cliente_id','Factura.moneda_id','Factura.monto_sin_igv','Factura.monto_igv'
						,'Factura.monto_con_igv','Factura.documento_id','Factura.numero','Factura.estadofactura_id','Factura.estadopago_id'
						,'Factura.usuario_id','Factura.id','Documento.numero_serie','Documento.tipodocumento_id','Factura.created'
						,'Cliente.razonsocial','Cliente.direccion','Cliente.dni'
						,'Moneda.simbolo','Moneda.nombre');
  
		$factura = $this->find('first',array('conditions'=>$conditions, 'fields'=>$fields));
		$factura['Detalles'] = $this->Detallefactura->getDetallefactura($factura_id);
		
		return $factura;
	}
}